/**
 * @file test_for_const.c
 * @version V0.01
 * @brief 区分指针常量和常量指针，以及衍生用法
 * @author 陈吉
 * @date 2024-09-09
 * @copyright Copyright (c) 2024, chenji 
 * All rights reserved.
 */
#include "test_for_const.h"

int* const func(void)
{
    static int a = 10;
    return &a;
}

//函数引用返回是 C++ 的特性， C 语言不支持
// const int& func2(void)
// {
//     static int b = 20;
//     return b;
// }

void test_for_const(void)
{
    printf("\r\ntest_for_const:\r\n");
    /* STEP 1 指针常量测试 */
    int a = 10;
    int b = 11;
    int* const ptr = &a; // ptr 指针常量
    // ptr = &b; // 这条语句编译时报错， ptr 是一个只读的值
    printf("\r\nCONST_TEST1:");
    printf("\r\nbefore changevalue: %d\r\n",*ptr);
    *ptr = 12; // 修改 ptr 指向的地址中的数据，合法
    printf("\r\nafter changevalue: %d\r\n",*ptr);

    /* STEP 2 常量指针测试 */
    int c = 10;
    int d = 11;
    const int* ptrx = &c; // ptrx 常量指针
    // *ptrx = 12;
    printf("\r\nCONST_TEST2:");
    printf("\r\nbefore changevalue: %d\r\n",*ptrx);
    ptrx = &d; //修改 ptrx 指向的地址是合法的
    printf("\r\nafter changevalue: %d\r\n",*ptrx);

    /* STEP 3 整形指针常量指针测试 */
    int* cx = &a;
    int* dx = &b;
    int* const * ptr_y = &cx; // ptry 整形指针常量指针
    ptr_y = &dx;
    int f = 13;
    // *ptr_y = &f;
    printf("\r\nCONST_TEST3:");
    printf("\r\nbefore changevalue: %d\r\n", **ptr_y);
    **ptr_y = 14; //修改 ptr_y 指向的地址是合法的
    printf("\r\nafter changevalue: %d\r\n", **ptr_y);
}